package br.com.hs.nfe.common.to;

import br.com.hs.nfe.common.anotation.Element;
import br.com.hs.nfe.common.anotation.TypeEnum;
import br.com.hs.nfe.common.enumeration.COFINSEnum;
import br.inf.portalfiscal.nfe.TNFe.InfNFe.Det.Imposto.COFINS;
import java.math.BigDecimal;

/**
 * Classe de informações da COFINS.
 * @author Ranlive Hrysyk
 */
public class CofinsTO extends BaseTO {

    @Element(elementName = "CST", publicName = "Cód. Situação Tributária da COFINS", type = TypeEnum.ENUM, classType = {COFINS.COFINSAliq.CST.Enum.class, COFINS.COFINSQtde.CST.Enum.class, COFINS.COFINSNT.CST.Enum.class, COFINS.COFINSOutr.CST.Enum.class})
    private COFINSEnum cst;
    @Element(publicName = "Valor da BC do COFINS", type = TypeEnum.DECIMAL, decimalCount = 2, required = false)
    private BigDecimal vBC;
    @Element(publicName = "Alíq. da COFINS (em percentual)", type = TypeEnum.DECIMAL, decimalCount = 2, required = false)
    private BigDecimal pCOFINS;
    @Element(publicName = "Valor da COFINS", type = TypeEnum.DECIMAL, decimalCount = 2, required = false)
    private BigDecimal vCOFINS;
    @Element(publicName = "Qtde. Vendida", type = TypeEnum.DECIMAL, decimalCount = 4, required = false)
    private BigDecimal qBCProd;
    @Element(publicName = "Alíq. da COFINS (em reais)", type = TypeEnum.DECIMAL, decimalCount = 4, required = false)
    private BigDecimal vAliqProd;

    /**
     * Código de Situação Tributária da COFINS.
     */
    public COFINSEnum getCSTEnum() {
        return cst;
    }

    /**
     * Código de Situação Tributária da COFINS.
     */
    public String getCST() {
        if (cst != null) {
            return cst.getCST();
        }
        return null;
    }

    /**
     * Informar o código de situação tributária da COFINS.
     * @param cst Código de Situação Tributária da COFINS
     */
    public void setCSTEnum(COFINSEnum cst) {
        this.cst = cst;
    }

    /**
     * Informar o código de situação tributária da COFINS.
     * <p>Este campo deverá ser obrigatoriamente preenchido com:
     * <br>01 - Operação Tributável - Base de Cálculo = Valor da Operação Alíquota Normal (Cumulativo/Não Cumulativo);
     * <br>02 - Operação Tributável - Base de Cálculo = Valor da Operação (Alíquota Diferenciada);
     * <br>03 - Operação Tributável - Base de Cálculo = Quantidade Vendida x Alíquota por Unidade de Produto;
     * <br>04 - Operação Tributável - Tributação Monofásica - (Alíquota Zero);
     * <br>06 - Operação Tributável - Alíquota Zero;
     * <br>07 - Operação Isenta da Contribuição;
     * <br>08 - Operação sem Incidência da Contribuição;
     * <br>09 - Operação com Suspensão da Contribuição;
     * <br>49 - Outras Operações de Saída;
     * <br>50 - Operação com Direito a Crédito - Vinculada Exclusivamente a Receita Tributada no Mercado Interno;
     * <br>51 - Operação com Direito a Crédito - Vinculada Exclusivamente a Receita Não Tributada no Mercado Interno;
     * <br>52 - Operação com Direito a Crédito - Vinculada Exclusivamente a Receita de Exportação;
     * <br>53 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno;
     * <br>54 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas no Mercado Interno e de Exportação;
     * <br>55 - Operação com Direito a Crédito - Vinculada a Receitas Não-Tributadas no Mercado Interno e de Exportação;
     * <br>56 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno, e de Exportação;
     * <br>60 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita Tributada no Mercado Interno;
     * <br>61 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita Não-Tributada no Mercado Interno;
     * <br>62 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita de Exportação;
     * <br>63 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno;
     * <br>64 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas no Mercado Interno e de Exportação;
     * <br>65 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Não-Tributadas no Mercado Interno e de Exportação;
     * <br>66 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno, e de Exportação;
     * <br>67 - Crédito Presumido - Outras Operações;
     * <br>70 - Operação de Aquisição sem Direito a Crédito;
     * <br>71 - Operação de Aquisição com Isenção;
     * <br>72 - Operação de Aquisição com Suspensão;
     * <br>73 - Operação de Aquisição a Alíquota Zero;
     * <br>74 - Operação de Aquisição sem Incidência da Contribuição;
     * <br>75 - Operação de Aquisição por Substituição Tributária;
     * <br>98 - Outras Operações de Entrada;
     * <br>99 - Outras Operações.
     * </p>
     * @param cst Código de Situação Tributária da COFINS
     */
    public void setCST(String cst) {
        this.cst = COFINSEnum.getEnumByCodigo(cst);
    }

    /**
     * Valor da BC da COFINS.
     */
    public BigDecimal getVBC() {
        return vBC;
    }

    /**
     * Informar o valor da base de cálculo da COFINS.
     * @param vBC Valor da BC da COFINS
     */
    public void setVBC(BigDecimal vBC) {
        this.vBC = vBC;
    }

    /**
     * Alíquota da COFINS (em percentual).
     */
    public BigDecimal getPCOFINS() {
        return pCOFINS;
    }

    /**
     * Informar a alíquota da COFINS (em percentual).
     * @param pCOFINS Alíquota da COFINS (em percentual)
     */
    public void setPCOFINS(BigDecimal pCOFINS) {
        this.pCOFINS = pCOFINS;
    }

    /**
     * Valor da COFINS.
     */
    public BigDecimal getVCOFINS() {
        return vCOFINS;
    }

    /**
     * Informar o valor da COFINS.
     * @param vCOFINS Valor da COFINS
     */
    public void setVCOFINS(BigDecimal vCOFINS) {
        this.vCOFINS = vCOFINS;
    }

    /**
     * Quantidade Vendida.
     */
    public BigDecimal getQBCProd() {
        return qBCProd;
    }

    /**
     * Informar a quantidade vendida.
     * @param qBCProd Quantidade Vendida
     */
    public void setQBCProd(BigDecimal qBCProd) {
        this.qBCProd = qBCProd;
    }

    /**
     * Alíquota da COFINS (em reais).
     */
    public BigDecimal getVAliqProd() {
        return vAliqProd;
    }

    /**
     * Informar a alíquota da COFINS (em reais).
     * @param vAliqProd Alíquota da COFINS (em reais)
     */
    public void setVAliqProd(BigDecimal vAliqProd) {
        this.vAliqProd = vAliqProd;
    }
}
